A complex software project or software system may include multiple modules, components, or objects, each of which may relate to one another in some manner. Of particular importance are those relations in which a module (or component, object, etc.) depends on another module for some functionality. This creates a dependency by one module on the other, or between the modules. If the independent module is changed, then care must be taken that the dependent module is similarly changed, or will not fail in some way because of the change. For ease of development, modules may also be grouped and developed in layers, or as subsystems of a larger, more complex system. However, popular programming languages such as the JAVA™ programming language cannot express dependencies and module architecture relations such as layers and subsystems. These relations inherently span multiple modules (i.e. packages in the JAVA™ programming language) and hence they cannot be captured within the programming language's concepts. What is needed is a more formalized approach to managing relations and dependencies between software modules to ensure better compliance with the overall software architecture.